package com.cskaoyan.javase.array._2memory;
/**
 * 数组的动态初始化过程
 * 主要理解：“何为引用数据类型”，因为数组是典型的引用数据类型
 *
 * @since 09:35
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    public static void main(String[] args) {

        // 动态初始化一个int类型数组
        int[] arr = new int[3];

        // 数组的基本操作
        // 输出数组名
        /*
            [I@1540e19d
            [表示这是一个一维数组
            I表示这是一个int类型数组
            @表示后面跟的是地址
            1540e19d这是一个十六进制的数
                它表示的是一个地址值
                一个十六进制的地址值
                这个地址值是堆上对象的一个地址

            arr是数组的名字，从变量的类型上来说，它是一个局部变量
            局部变量应该存储在方法的栈帧中

            new后面跟一个数组的动态初始化，new关键字表示在堆上开辟空间，创建对象
            在这里
            表示在堆上开辟空间，创建一个长度为3的int类型数组对象

            基本数据类型变量，它一定是一个局部变量，一定在方法的栈帧中存储
            但引用数据类型变量，要分成两个部分，在方法的栈帧中开辟空间，存储一个
            对象的名字，称之为引用
            然后在堆上开辟空间创建对象

            堆上的对象才是引用数据类型的实质，但是我们只能通过引用间接的访问堆上的对象

            栈上的引用如何和堆上的对象产生联系呢？
            通过存储堆上对象的地址，栈上的引用就和堆上的对象产生了关系
         */
        System.out.println(arr);

        // 不想看地址，希望能够看到元素的取值
        // int类型数组当中元素的默认值是0
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);

        arr[0] = 10;
        arr[1] = 20;
        arr[2] = 30;
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);

        System.out.println(arr);

    }
}
